package com.sojson.util.encrypt.oneway.imparity.bcrypt;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import com.sojson.util.StringUtil;
import com.sojson.util.encrypt.EncryptUtil;

/**
 * BCrypt单向非对称加密工具类
 * 
 * @author liu
 * @date 2020-09-04
 */
public class BCryptUtil {

    private static final BCryptPasswordEncoder BC = new BCryptPasswordEncoder();

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static String encrypt(String data) {
        return BC.encode(data);
    }

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static byte[] encrypt(byte[] data) {
        return encryptToStr(data).getBytes();
    }

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static byte[] encryptToByte(String data) {
        return encrypt(data).getBytes();
    }

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static String encryptToStr(byte[] data) {
        return encrypt(new String(data));
    }

    /**
     * 加密
     * 
     * @param data  内容
     * @param key   密钥
     * @return
     */
    public static String encrypt(String data, String key) {
        return encryptToStr(data.getBytes(), key);
    }

    /**
     * 加密
     * 
     * @param data  内容
     * @param key   密钥
     * @return
     */
    public static byte[] encrypt(byte[] data, String key) {
        return encryptToStr(data, key).getBytes();
    }

    /**
     * 加密
     * 
     * @param data  内容
     * @param key   密钥
     * @return
     */
    public static byte[] encryptToByte(String data, String key) {
        return encrypt(data, key).getBytes();
    }

    /**
     * 加密
     * 
     * @param data  内容
     * @param key   密钥
     * @return
     */
    public static String encryptToStr(byte[] data, String key) {
        if (StringUtil.isNotBlankObject(key)) {
            data = EncryptUtil.keyEncrypt(data, key);
        }

        return encryptToStr(data);
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @return
     */
    public static boolean matches(String data, String encryptData) {
        return BC.matches(data, encryptData);
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @return
     */
    public static boolean matches(byte[] data, byte[] encryptData) {
        return matches(new String(data), new String(encryptData));
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @return
     */
    public static boolean matches(String data, byte[] encryptData) {
        return matches(data, new String(encryptData));
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @return
     */
    public static boolean matches(byte[] data, String encryptData) {
        return matches(new String(data), encryptData);
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @param key           密钥加密后的内容
     * @return
     */
    public static boolean matches(String data, String encryptData, String key) {
        return matches(data.getBytes(), encryptData, key);
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @param key           密钥加密后的内容
     * @return
     */
    public static boolean matches(byte[] data, byte[] encryptData, String key) {
        return matches(data, new String(encryptData), key);
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @param key           密钥加密后的内容
     * @return
     */
    public static boolean matches(String data, byte[] encryptData, String key) {
        return matches(data, new String(encryptData), key);
    }

    /**
     * 比较两个内容是否相同
     * 
     * @param data          内容
     * @param encryptData   加密后的内容
     * @param key           密钥加密后的内容
     * @return
     */
    public static boolean matches(byte[] data, String encryptData, String key) {
        if (StringUtil.isNotBlankObject(key)) {
            data = EncryptUtil.keyEncrypt(data, key);
        }

        return matches(new String(data), encryptData);
    }

    /**
     * 获取BCrypt
     * 
     * @return
     */
    public static BCryptPasswordEncoder getBCrypt() {
        return BC;
    }

}